// 节流
function torottled(fn, delay) {
    // 在节流函数中触发事件处理函数
    let timer = null
    let startTime = Date.now() //获取当前时间戳
    //页面刷新后立刻获取
    return function proxy() {
        //滚动触发事件
        let curTime = Date.now()//触发事件的时间戳  curTime一定是比startTime要大
        let remaining = delay - (curTime - startTime)
        //判断两个事件的时间间隔是否满足我设置的时间间隔
        if (remaining < 0) {
            // 说明时间处理函数可以触发了
            fn()
            //为了计算下一次的时间间隔 是否大于设置的delay时间间隔
            startTime = Date.now()
        } else {
            //说明事件在我们限制的间隔时间内，不能让他继续触发
            //开启一个定时器，延迟事件的执行
            timer = setTimeout(fn, remaining)
        }
    }
}
// 防抖
function debounce(fn, wait, immediate) {
    if (typeof fn !== 'function') {
        alert('fn参数必须是函数')
    }
    if (typeof wait !== 'number') {
        alert('输入必须是数字')
    }
    if (typeof immediate !== 'boolean') {
        alert('请输入布尔值')
    }

    let timeout
    return function proxy() {
        if (timeout) {
            clearTimeout(timeout)
        }
        if (immediate) {
            let timeNow = !timeout
            timeout = setTimeout(function () {
                timeout = null
            }, wait)
            if (timeNow) {
                fn.apply(this, arguments)
            }
        } else {
            timeout = setTimeout(() => {
                fn.apply(this, arguments)
            }, wait)
        }
    }
}
// promise + ajax
function myAjax(url, method, data, token) {
    let promise = new Promise((resolve, reject) => {
        let xhr = new XMLHttpRequest()
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4) {
                if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
                    resolve(JSON.parse(xhr.response))
                } else {
                    reject(new Error("error"))
                }
            }
        }
        if (method.toUpperCase() === "GET") {
            let paramslist = [];
            for (let key in data) {
                paramslist.push(key + "=" + data[key])
            }
            //根据get请求方法对url进行拼接
            let params = paramslist.join("&");
            url = url + "?" + params;

            xhr.open("get", url);
            //使用get请求将内容连接在url后面
            // 判断有没有 token
            if (token) {
                xhr.setRequestHeader('x-token', token)
            }
            // xhr.headers.token = token
            xhr.send()

        }
        if (method.toUpperCase() === "POST") {
            xhr.open("post", url);
            xhr.setRequestHeader("Content-Type", "application/json");
            // xhr.setRequestHeader('x-token',token)
            xhr.setRequestHeader['x-token'] = token
            xhr.send(JSON.stringify(data));
            //使用post请求时将内容放在send里面
        }

    })
    return promise
}
// 过期storage
let myStorage = {
    // time 是分钟
    set(key, value, time) {
        // 我们在使用的过程中，不传递这个time的时候，设置一个默认时间
        if (!time) {
            // 如果传递参数time，不走这个分支
            // 设置默认时间 60分钟
            time = 60;
        }
        // 结束时间戳
        const endTime = (new Date()).getTime() + time * 60 * 1000;
        localStorage.setItem(key, JSON.stringify({
            data: value,
            time: endTime
        }))
    },
    get(key) {
        // 判断一下 key 在不在
        if (!localStorage.getItem(key)) {
            return null
        }
        // 判断一下当前key值的时间戳是否过期
        let result = JSON.parse(localStorage.getItem(key))
        // 获取当前的时间戳
        let now = (new Date()).getTime();
        // 如果过期，调用remove方法去删除
        if (now > result.time) {
            this.remove(key)
            return null
        }
        // 如果没有过期，正常返回
        return result.data
    },
    remove(key) {
        localStorage.removeItem(key);
    }
}

export default {
    debounce,
    torottled,
    myAjax,
    myStorage
}